package br.ufal.ic.core;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

/**
 * Entidade que representa um competidor em um torneio.
 * 
 * @author Marcos Paulo
 */
@Entity
public class Competitor extends Cubist implements Serializable {

    /**
     * Quanto mais distante de zero melhor sera o competidor.
     */
    private int level;
    /**
     * Todos os cubos do competidor.
     */
    @OneToMany
    private List<Cube> cubes;
    /**
     * O cubo que o competidor esta usando na competição
     */
    @OneToOne(cascade = {CascadeType.ALL})
//    @Cascade(CascadeType.SAVE_UPDATE)
    private Cube currentCube;

    protected Competitor() {
        //for hibernate
    }

    public Competitor(CubistInformation information, Cube cube) {
        super(information);
        this.currentCube = cube;
        this.cubes = new ArrayList<Cube>();
        this.cubes.add(cube);

        this.level = 0;

    }

    /**
     * Adiciona um cubo a lista de cubos do competidor.
     * @param cube cubo a ser adicionado.
     */
    public void addCube(Cube cube) {
        cubes.add(cube);
    }

    /**
     * Muda o cubo que está sendo utilizado atualmente.
     * @param cube cubo a ser setado.
     */
    public void setCurrentCube(Cube cube) {
        if (!cubes.contains(cube)) {
            throw new IllegalArgumentException("cubo :" + cube + " não pertence"
                    + " a esse competidor");
        }

        currentCube = cube;
    }

    /**
     *
     * @return todos cubos do competidor.
     */
    public List<Cube> getCubes() {
        return cubes;
    }

    /**
     *
     * @return cubo que o competidor ta usando atualmente.
     */
    public Cube getCurrentCube() {
        return currentCube;
    }

    /**
     *
     * @return o level do competidor.
     */
    public int getLevel() {
        return level;
    }

    /**
     * Incrementa o level do competidor +1.
     */
    public void upLevel() {
        level++;
    }
}
